BootApplication.controller("NotificheController",
		["configuration", "$scope", "$rootScope", "$filter", "$translate", "$timeout", "$http", "log", "channelManager", "configuration", "$mdToast",
		 "$translate", "NotificheSrv",
		function(config, $scope, $rootScope, $filter, $translate, $timeout, $http, log, channelManager, configuration, $mdToast, $translate, NotificheSrv) {

 /** ===================================================== INIT ================================================ **
	
	/* Contatori specifici per tipologia di notifica */
	$scope.numInfo = 0;
	$scope.numWarning = 0;
	$scope.numErrors = 0;
	$scope.numCritical = 0;
	$scope.numExports = 0;

	/* Contatore notifiche */
	$scope.numTotNotifiche = 0;

	/* Liste notifiche */
	$scope.infos = [];
	$scope.warnings = [];
	$scope.errors = [];
	$scope.criticals = [];
	$scope.exports = [];

	/* Attivazione del primo come deafult */
	$scope.activeTabNotifiche = 1;

	/*
	 * La sottoscrizione al topic "/{user}/export" è specifica per l'utente autenticato, la stringa di teso "{user}" deve essere
	 * sostituita con l'id utente.
	 *
	 * Configurazione nome topic su cui mettersi in ascolto per notificare che il file da esportare è pronto.
	 */
	var exportTopic = configuration.getParam("Constants").EXPORT_TOPIC_NAME.replace(new RegExp("{user}", 'g'), "9");
	/*
	 *
	 */
	var alertTopic = "SmartTPLAlert";

 /** ===================================================== WATCH ================================================ **/

	$scope.$watch('[numInfo,numWarning,numErrors,numCritical,numExports]', function () {
		$scope.numTotNotifiche = $scope.numInfo + $scope.numWarning + $scope.numErrors + $scope.numCritical + $scope.numExports;
	}, true);

 /** ===================================================== CHANNEL ================================================ **/

	/*
	 * Creo il channel di modo che il client si sottoscriva al topic degli "alert" e a quello degli export.
	 */
	var _channelAlert = {};

	var _nameChannelAlert = configuration.getParam("Constants").TIPO_NOTIFICA_ALERT;
		_channelAlert.name       = _nameChannelAlert;
		_channelAlert.protocol   = configuration.getParam("Constants").BrokerProtocol;
		_channelAlert.brokerUrl  = configuration.getParam("Constants").BrokerHost;
		_channelAlert.brokerPort = configuration.getParam("Constants").BrokerPort;
		_channelAlert.clientId   = Math.random() + "";
		_channelAlert.topics     = [ alertTopic ];

	channelManager.addChannel(_channelAlert);
	channelManager.activate(_nameChannelAlert);

	var _channelReport = {};
		_channelReport.name = configuration.getParam("Constants").EXPORT_CHANNEL_EVENT;
		_channelReport.protocol = configuration.getParam("Constants").BrokerProtocol;
		_channelReport.brokerUrl = configuration.getParam("Constants").BrokerHost;
		_channelReport.brokerPort = configuration.getParam("Constants").BrokerPort;
		_channelReport.clientId = Math.random() + "";
		_channelReport.topics = [ exportTopic ];

	channelManager.addChannel(_channelReport);
	channelManager.activate(configuration.getParam("Constants").EXPORT_CHANNEL_EVENT);

 /** ===================================================== EVENT ================================================ **/
	$scope.levelInfo     = NotificheSrv.getConstant('ALERT_LEVEL_INFO'    );
	$scope.levelWarning  = NotificheSrv.getConstant('ALERT_LEVEL_WARNING' );
	$scope.levelError    = NotificheSrv.getConstant('ALERT_LEVEL_ERROR'   );
	$scope.levelCritical = NotificheSrv.getConstant('ALERT_LEVEL_CRITICAL');
	$scope.eventMap      = NotificheSrv.getConstant('ALERT_EVENT_MAP'     );
	
	//ASCOLTO NOTIFICA PER RICALCOLO PREFERENZE (vedi userNotifiche.js)
	NotificheSrv.getUserPreference();
	$rootScope.$on(NotificheSrv.getConstant('EVENTO_RELOAD_PREFERENZE_NOTIFICHE'), function(_event, _data) {
		NotificheSrv.getUserPreference();
	});
	//INIZIO ASCOLTO SU TIPO NOTIFICA. IL BRODCAST SI FA IN eventi.js 
	
	//AGGIUNTA NOTIFICA DISTANZA PUNTO FISSO
	$rootScope.$on(NotificheSrv.getConstant('TIPO_ALERT_DISTANZA_PUNTO_FISSO'), function(_event, _data) {
		_notifica = NotificheSrv.getNotificaDistanzaPuntoFisso(_data);
		$scope.aggiornaListeNotifica(_notifica);
	});
	//AGGIUNTA NOTIFICA AREA PROTETTA
	$rootScope.$on(NotificheSrv.getConstant('TIPO_ALERT_AREA_PROTETTA'), function(_event, _data) {
		_notifica = NotificheSrv.getNotificaAreaProtetta(_data);
		$scope.aggiornaListeNotifica(_notifica);
	});
	//AGGIUNTA NOTIFICA SEMAFORO GUASTO
	$rootScope.$on(NotificheSrv.getConstant('TIPO_ALERT_SEMAFORO_GUASTO'), function(_event, _data) {
		_notifica = NotificheSrv.getNotificaSemaforoGuasto(_data);
		$scope.aggiornaListeNotifica(_notifica);
	});
	//AGGIUNTA NOTIFICA SEMAFORO RIPARATO
	$rootScope.$on(NotificheSrv.getConstant('TIPO_ALERT_SEMAFORO_RIPARATO'), function(_event, _data) {
		_notifica = NotificheSrv.getNotificaSemaforoRiparato(_data);
		$scope.aggiornaListeNotifica(_notifica);
	});
	//AGGIUNTA NOTIFICA INCENDIO
	$rootScope.$on(NotificheSrv.getConstant('TIPO_ALERT_INCENDIO'), function(_event, _data) {
		_notifica = NotificheSrv.getNotificaIncendio(_data);
		$scope.aggiornaListeNotifica(_notifica);
	});
	//AGGIUNTA NOTIFICA INCENDIO
	$rootScope.$on(NotificheSrv.getConstant('TIPO_ALERT_TERMINE_INCENDIO'), function(_event, _data) {
		_notifica = NotificheSrv.getNotificaTemineIncendio(_data);
		$scope.aggiornaListeNotifica(_notifica);
	});
	//AGGIUNTA NOTIFICA ARMA DA FUOCO
	$rootScope.$on(NotificheSrv.getConstant('TIPO_ALERT_ARMA_DA_FUOCO'), function(_event, _data) {
		_notifica = NotificheSrv.getNotificaArmaDaFuoco(_data);
		$scope.aggiornaListeNotifica(_notifica);
	});
	//AGGIUNTA NOTIFICA RITARDO
	$rootScope.$on(NotificheSrv.getConstant('TIPO_ALERT_RITARDO'), function(_event, _data) {
		_notifica = NotificheSrv.getNotificaRitardo(_data);
		$scope.aggiornaListeNotifica(_notifica);
	});
	//AGGIUNTA NOTIFICA ALALRME MEZZO
	$rootScope.$on(NotificheSrv.getConstant('TIPO_ALERT_ALLARME_MEZZO'), function(_event, _data) {
		_notifica = NotificheSrv.getNotificaAllarmeMezzo(_data);
		$scope.aggiornaListeNotifica(_notifica);
	});
	//FUNCTION PER AGGIORNARE LISTA
	$scope.aggiornaListeNotifica = function(_notifica){
		if(!_notifica)
			return ;
		_severity = _item.severity;
		_list = null;
		if (_severity == $scope.levelInfo) {
			$scope.numInfo++;
			_list = $scope.infos;
		}else if (_severity == $scope.levelWarning) {
			$scope.numWarning++;
			_list = $scope.warnings;
	    }else if (_severity == $scope.levelError) {
			$scope.numErrors++;
			_list = $scope.errors;
	    }else if (_severity == $scope.levelCritical) {
			$scope.numCritical++;
			_list = $scope.criticals;
		}
		if(_list){
			//Si passano in avanti gli elementi delle liste
			for (i = Math.min(4, _list.length); i >= 1; i--){
				_list[i] = _list[i - 1];
			}
//Si salva in prima posizione la notifica			
			_list[0] = _item;
//Si aggiorna la lista a video
			try{
				$scope.$apply();
			}catch(e){
				
			}
		}
	};//fine aggiornaListeNotifica

	//Polling per eliminare notifiche vecchie
	NotificheSrv.pollingNotificheAlert();

 /** ===================================================== EXPORT/REPORT ================================================ **/
	
	/**
	 *
	 */
	$rootScope.$on(configuration.getParam("Constants").EXPORT_CHANNEL_EVENT, function(_event, _data) {
		/* shifto gli elementi di una posizione */
		for (i = Math.min(4, $scope.exports.length); i >= 1; i--) $scope.exports[i] = $scope.exports[i - 1];

		/* aggiungo una proprieta al bean che individua il file come non scaricato */
		_data.download = false;

		/* aggiungo la nuova notifica all'array */
		$scope.exports[0] = _data;

		/* incremento il contatore */
		$scope.numExports = $scope.exports.length;

		$scope.toast = $mdToast.show({
			hideDelay: false,
			position: 'top right',
			template: "<md-toast>" +
					  	 "<span class='md-toast-text bold' flex>{{'notifica.avvisoNuovaNotifica' | translate}}</span>" +

					  	 "<md-button style='color: #16A616;' ng-click='openToastNotifica($event)' aria-label=\"{{'notifica.vaiAllaNotifica' | translate}}\" >" +
					  		"<md-tooltip md-direction='bottom'>{{'notifica.vaiAllaNotifica' | translate}}</md-tooltip>" +
					  	 	"<i class='fa fa-angle-double-right' aria-hidden='true'></i>" +
	          			 "</md-button>" +

	          			 "<md-button class='md-highlight' ng-click='closeToastNotifica()' aria-label=\"{{'notifica.chiudiNotifica' | translate}}\">" +
	          			 	"<md-tooltip md-direction='bottom'>{{'notifica.chiudiNotifica' | translate}}</md-tooltip>" +
	          			 	"<i class='fa fa-times' aria-hidden='true'></i>" +
	          			 "</md-button>" +
	          		  "</md-toast>",
	        scope: $scope,
	        bindToController: true,
	        preserveScope: true
	   });
	});// close evento "NotificheReport"

	/**
	 * Download report o export
	 */
	$scope.downloadExport = function (_data){
		/* Get identificativo */
		var analisiId = _data.analisiId;

		/* Valorizzo a true la proprietà che segnala il file come gia scaricato */
		_data.download = true;

		window.location.href =
			 configuration.getParam("Constants").ContextPath + configuration.getParam("Constants").URL_DOWNLOAD_REPORT_ANALISYS + "?analisiId=" + analisiId;
	}

	/**
	 * Apre la dropdown e seleziona il tab delle notifiche
	 */
	$scope.openToastNotifica = function (event){
		if(event) event.preventDefault();
		/**
		 * Chiude il Toast.
		 */
		$mdToast.cancel($scope.toast);
		/**
		 * Attivazione tab
		 */
		$scope.activeTabNotifiche = 5;
		/**
		 * Apertura dropdown
		 */
		$('#myButtonNotifiche').dropdown('toggle');
	}

	/**
	 * Chiude il Toast.
	 */
	$scope.closeToastNotifica = function (){
		$mdToast.cancel($scope.toast);
	}

}]);//ARGOMENTI CONTROLLER